package gin_handler

import (
	"log"
	"net/http"

	"github.com/gin-gonic/gin"

	app_util "app/app_src/framework/app/util"
	error_util "app/app_src/framework/util/error"
	log_util "app/app_src/framework/util/log"

	web_util "app/app_src/framework/util/web"

	web_constants "app/app_src/framework/constant/web"

	error_constants "app/app_src/framework/constant/error"
)

// 处理错误的处理器

func ServerErrorHandler(ctx *gin.Context) {
	defer func() {
		if r := recover(); r != nil {
			logger := log_util.GetZapLogger()
			defer logger.Sync()

			if !app_util.IsProdEnv() {
				log.Println(r)
			}

			errorMsg := error_util.GetErrorMessage(r)
			logger.Error(errorMsg)

			request := ctx.Request
			header := request.Header
			contentType := header.Get(web_constants.HEADER_CONTENT_TYPE)

			// 根据请求头字段判断是返回 JSON 格式还是页面
			if contentType == web_constants.REQUEST_HEADER_CONTENT_TYPE_JSON {
				if app_util.IsProdEnv() {
					// 为了安全，生产环境上不返回详细的错误信息
					web_util.AppErrorResult(ctx, error_constants.UNKNOWN_ERROR, "")
				} else {
					web_util.AppErrorResult(ctx, error_constants.UNKNOWN_ERROR, errorMsg)
				}
			} else {
				web_util.HTML(ctx, http.StatusInternalServerError, "error/500", nil)
			}

			ctx.Abort()
		}
	}()

	ctx.Next()
}
